'''
@Project ：my_python_project 
@File    ：test2.py
@IDE     ：PyCharm 
@Author  ：xionglinhui
@Date    ：2024/8/7 上午8:37 
'''
# 一：名称空间namespaces：存放名字的地方，是对栈区的划分
# 有了名称空间之后，就可以在栈区中存放相同的名字，详细的，名称空间
# 分为三种
# 1.1 内置名称空间
# 存放的名字：存放的python解释器内置的名字
'''
>>> print
<built-in function print>
>>> input
<built-in function input>
'''
# 存活周期：python解释器启动则产生，python解释器关闭则销毁



# 1.2 全局名称空间
# 存放的名字：只要不是函数内定义、也不是内置的，剩下的都是全局名称空间的名字
# 存活周期：python文件执行则产生，python文件运行完毕后销毁

import os

# x=10
# if 13 > 3:
#     y=20
#     if 3 == 3:
#         z=30
#
# # # func=函数的内存地址
# def func():
#     a=111
#     b=222
#
# class Foo:
#     pass


# 如果当前在局部名称空间：
# 局部名称空间—>全局名称空间->内置名称空间
# input=333
#
# def func():
#     input=444
#     print(input)
#
# func()  #  444 注:当前在局部名称空间找，有input=444,所以print(input) 结果为444
# print(input)  # 333 注：不在函数内，现在全局名称空间找，有input=333，结果为333


# 如果当前在全局名称空间
# 全局名称空间->内置名称空间
# input=333
# def func():
#     input=444
# func()
# print(input)


# # 示范1: 局部名称空间没有，往全局名称空间找
# def func():
#     print(x)
# x=111
#
# func()  #  111


# # 示范2：名称空间的"嵌套"关系是以函数定义阶段为准，与调用位置无关
# x=111
# def func():
#    print(x)
#
#
# def foo():
#     x=222
#     func()
#
# foo()   # 111

# 示范3：函数嵌套定义
# input=111
# def f1():
#     def f2():
#         input=333
#         print(input)
#     # input=222
#
#     # f2()
#
# f1()


# 示范：函数嵌套定义,
input=111
def f1():
    input=222
    def f2():
        input=333
        print(input)
    # f2()

f1()




# # 示范4：函数定义时没语法错误，调用时存在语法错误，x 定义前被调用
# x=111
# def func():
#     print(x)
#     x=222
#
# func()  # UnboundLocalError: local variable 'x' referenced before assignment